
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


    //导入Swing库中的JOptionPane类，用于创建对话框

    //定义银行账户类，封装账户的属性和操作
    class BankAccount {
        // 账户号码
        private String accountNumber;
        // 账户用户名
        private String username;
        // 账户密码
        private String password;
        // 账户余额
        private double balance;
        // 账户利率
        private double interestRate;

        // 构造函数，用于初始化银行账户对象
        public BankAccount(String accountNumber, String username, String password, double balance, double interestRate) {
            this.accountNumber = accountNumber;
            this.username = username;
            this.password = password;
            this.balance = balance;
            this.interestRate = interestRate;
        }

        // 存钱方法
        public void deposit(double amount) {
            // 检查存入金额是否大于0
            if (amount > 0) {
                // 若大于0，更新账户余额
                balance += amount;
                // 弹出对话框提示存钱成功及存入金额
                JOptionPane.showMessageDialog(null, "存钱成功，存入金额: " + String.format("%.2f", amount) + " 元");
            } else {
                // 若存入金额不大于0，弹出对话框提示重新操作
                JOptionPane.showMessageDialog(null, "存入金额必须为正数，请重新操作。");
            }
        }

        // 取钱方法，需要输入取款金额和密码
        public boolean withdraw(double amount, String inputPassword) {
            // 检查输入的密码是否正确
            if (!inputPassword.equals(password)) {
                // 若密码错误，弹出对话框提示并返回false
                JOptionPane.showMessageDialog(null, "密码错误，无法完成取款。");
                return false;
            }
            // 检查取款金额是否大于0且账户余额足够
            if (amount > 0 && balance >= amount) {
                // 若条件满足，更新账户余额
                balance -= amount;
                // 弹出对话框提示取钱成功及取出金额
                JOptionPane.showMessageDialog(null, "取钱成功，取出金额: " + String.format("%.2f", amount) + " 元");
                return true;
            } else {
                // 若条件不满足，弹出对话框提示并返回false
                JOptionPane.showMessageDialog(null, "余额不足或者取款金额无效，无法完成取款。");
                return false;
            }
        }

        // 添加利息方法
        public void addInterest() {
            // 计算利息
            double interest = balance * interestRate;
            // 更新账户余额
            balance += interest;
            // 弹出对话框提示利息已添加及利息金额
            JOptionPane.showMessageDialog(null, "利息已添加，本次利息金额: " + String.format("%.2f", interest) + " 元");
        }

        // 查询余额方法，返回当前账户余额
        public double checkBalance() {
            return balance;
        }

        // 获取账户用户名的方法
        public String getUsername() {
            return username;
        }

        // 获取账户号码的方法
        public String getAccountNumber() {
            return accountNumber;
        }

        // 重写toString方法，用于返回账户信息的字符串表示
        @Override
        public String toString() {
            return String.format("账号: %s, 用户名: %s, 余额: %.2f 元", accountNumber, username, balance);
        }
    }

    //定义银行账户管理系统的图形界面类，继承自JFrame
    public class BankAccountGUI extends JFrame {
        // 存储两个银行账户对象的数组
        private BankAccount[] accounts = new BankAccount[2];
        // 用于输入要操作的账户号码的文本框
        private JTextField accountNumberField;
        // 用于显示操作结果的文本区域
        private JTextArea resultArea;

        // 构造函数，初始化图形界面
        public BankAccountGUI() {
            // 初始化两个银行账户
            initializeAccounts();

            // 设置窗口标题为“银行账户管理系统”
            setTitle("银行账户管理系统");
            // 设置窗口大小为600x400像素
            setSize(600, 400);
            // 设置关闭窗口时的操作为退出程序
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            // 设置窗口的布局管理器为BorderLayout
            setLayout(new BorderLayout());

            // 创建一个面板用于放置输入组件
            JPanel inputPanel = new JPanel();
            // 创建一个标签提示用户输入账户号码
            JLabel accountNumberLabel = new JLabel("请输入要操作的用户账号: ");
            // 创建一个文本框用于输入账户号码
            accountNumberField = new JTextField(20);
            // 创建一个按钮，点击后进入账户操作
            JButton enterButton = new JButton("进入操作");
            // 将标签、文本框和按钮添加到输入面板
            inputPanel.add(accountNumberLabel);
            inputPanel.add(accountNumberField);
            inputPanel.add(enterButton);

            // 创建一个文本区域用于显示操作结果
            resultArea = new JTextArea(20, 40);
            // 设置文本区域为不可编辑
            resultArea.setEditable(false);
            // 创建一个滚动面板，将文本区域添加到滚动面板中
            JScrollPane scrollPane = new JScrollPane(resultArea);

            // 将输入面板添加到窗口的北部
            add(inputPanel, BorderLayout.NORTH);
            // 将滚动面板添加到窗口的中部
            add(scrollPane, BorderLayout.CENTER);

            // 为“进入操作”按钮添加事件监听器
            enterButton.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    // 获取用户输入的账户号码
                    String inputAccountNumber = accountNumberField.getText();
                    // 根据输入的账户号码查找对应的银行账户
                    BankAccount targetAccount = findAccount(inputAccountNumber);
                    if (targetAccount == null) {
                        // 若未找到该账户，弹出对话框提示重新输入
                        JOptionPane.showMessageDialog(null, "未找到该账号，请重新输入。");
                    } else {
                        // 若找到该账户，显示操作菜单
                        showOperationMenu(targetAccount);
                    }
                }
            });

            // 显示窗口
            setVisible(true);
        }

        // 初始化两个银行账户的方法
        private void initializeAccounts() {
            for (int i = 0; i < 2; i++) {
                // 通过对话框获取用户输入的账户号码
                String accountNumber = JOptionPane.showInputDialog("请输入第 " + (i + 1) + " 个用户的账号:");
                // 通过对话框获取用户输入的用户名D:\新建文件夹 (3)\kkcd
                String username = JOptionPane.showInputDialog("请输入第 " + (i + 1) + " 个用户的用户名:");
                // 通过对话框获取用户输入的密码
                String password = JOptionPane.showInputDialog("请输入第 " + (i + 1) + " 个用户的密码:");
                // 通过对话框获取用户输入的初始余额，并转换为double类型
                double balance = Double.parseDouble(JOptionPane.showInputDialog("请输入第 " + (i + 1) + " 个用户的初始余额:"));
                // 通过对话框获取用户输入的利率，并转换为double类型
                double interestRate = Double.parseDouble(JOptionPane.showInputDialog("请输入第 " + (i + 1) + " 个用户的利率:"));
                // 创建银行账户对象并存储到数组中
                accounts[i] = new BankAccount(accountNumber, username, password, balance, interestRate);
            }
        }

        // 根据账户号码查找对应的银行账户的方法
        private BankAccount findAccount(String accountNumber) {
            for (BankAccount account : accounts) {
                if (account.getAccountNumber().equals(accountNumber)) {
                    return account;
                }
            }
            return null;
        }

        // 显示账户操作菜单的方法
        private void showOperationMenu(BankAccount account) {
            // 定义操作选项数组
            String[] options = {"存钱", "取钱", "查询余额", "添加利息", "退出当前账户操作"};
            // 显示操作菜单对话框，让用户选择操作
            int choice = JOptionPane.showOptionDialog(null, "请选择操作：", account.getUsername() + " 的操作菜单",
                    JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);
            switch (choice) {
                case 0:
                    // 若用户选择存钱，通过对话框获取存入金额
                    String depositInput = JOptionPane.showInputDialog("请输入存钱金额:");
                    try {
                        // 将输入的金额转换为double类型
                        double depositAmount = Double.parseDouble(depositInput);
                        // 调用存钱方法进行存钱操作
                        account.deposit(depositAmount);
                        // 在结果文本区域添加交易后账户信息
                        resultArea.append("交易后账户信息: " + account.toString() + "\n");
                    } catch (NumberFormatException ex) {
                        // 若输入的金额格式不正确，弹出对话框提示重新输入
                        JOptionPane.showMessageDialog(null, "输入的金额格式不正确，请重新输入。");
                    }
                    // 再次显示操作菜单
                    showOperationMenu(account);
                    break;
                case 1:
                    // 若用户选择取钱，通过对话框获取取款金额
                    String withdrawInput = JOptionPane.showInputDialog("请输入取款金额:");
                    try {
                        // 将输入的金额转换为double类型
                        double withdrawAmount = Double.parseDouble(withdrawInput);
                        // 通过对话框获取用户输入的密码
                        String inputPassword = JOptionPane.showInputDialog("请输入密码:");
                        if (account.withdraw(withdrawAmount, inputPassword)) {
                            // 若取款成功，在结果文本区域添加交易后账户信息
                            resultArea.append("交易后账户信息: " + account.toString() + "\n");
                        }
                    } catch (NumberFormatException ex) {
                        // 若输入的金额格式不正确，弹出对话框提示重新输入
                        JOptionPane.showMessageDialog(null, "输入的金额格式不正确，请重新输入。");
                    }
                    // 再次显示操作菜单
                    showOperationMenu(account);
                    break;
                case 2:
                    // 若用户选择查询余额，调用查询余额方法获取当前余额
                    double currentBalance = account.checkBalance();
                    // 弹出对话框显示当前余额
                    JOptionPane.showMessageDialog(null, "当前余额: " + String.format("%.2f", currentBalance) + " 元");
                    // 在结果文本区域添加查询后账户信息
                    resultArea.append("查询后账户信息: " + account.toString() + "\n");
                    // 再次显示操作菜单
                    showOperationMenu(account);
                    break;
                case 3:
                    // 若用户选择添加利息，调用添加利息方法
                    account.addInterest();
                    // 在结果文本区域添加交易后账户信息
                    resultArea.append("交易后账户信息: " + account.toString() + "\n");
                    // 再次显示操作菜单
                    showOperationMenu(account);
                    break;
                case 4:
                    // 若用户选择退出当前账户操作，弹出对话框提示
                    JOptionPane.showMessageDialog(null, "退出当前账户操作。");
                    break;
            }
        }

        // 程序入口方法
        public static void main(String[] args) {
            // 在事件调度线程中创建并显示图形界面
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new BankAccountGUI();
                }
            });
        }
    }


